// 生成器

// 特殊的函数，试用于异步编程，纯回调函数 --》 node fs ajax mongodb

// 包含函数运行断点

function * gen(){
    console.log('hellow Word')
}

// generator 函数调用
//错误调用
// gen()

// 正确调用
let genIterator = gen()
genIterator.next(); // hellow Word

// 断点

function * point(){
    yield '第一次';
    yield '第二次';
    yield '第三次';
    yield '第四次';
}
let iterator = point()
console.log(iterator.next()) //{ value: '第一次', done: false }
console.log(iterator.next()) //{ value: '第二次', done: false }
console.log(iterator.next()) //{ value: '第三次', done: false }
console.log(iterator.next()) //{ value: '第四次', done: false }
console.log(iterator.next()) //{ value: undefined, done: true


// 生成器函数参数

function * parameter(arg){
    console.log(arg)
    let one = yield '第一次';

    console.log(one,'/第一次')
    let two = yield '第二次';

    console.log(two,'/第二次')
}

let parameteriterator = parameter('生成器函数参数')

console.log(parameteriterator.next('one')) //生成器函数参数
                                           //{ value: '第一次', done: false }
console.log(parameteriterator.next('two')) //two /第一次
                                           //{ value: '第二次', done: false }
console.log(parameteriterator.next('last'))//last /第二次
                                           //{ value: undefined, done: true }

// 回调地域-----》异步编程生成器函数

    // 旧版异步编程实现方式

    // setTimeout(function(){
    //     console.log('1111')
    //     setTimeout(function(){
    //         console.log('2222')
    //         setTimeout(function(){
    //             console.log('3333')
    //         },3000)
    //     },2000)
    // },1000)


    // 使用生成器

    function * stoGenerator (){
        yield STO1();
        yield STO2();
        yield STO3();
    }

    let stoIterator = stoGenerator()

    stoIterator.next()

    function STO1 (){
        setTimeout(function(){
            console.log('1111')
            stoIterator.next()
        },1000)
    }

    function STO2 (){
        setTimeout(function(){
            console.log('2222')
            stoIterator.next()
        },1000)
    }

    function STO3 (){
        setTimeout(function(){
            console.log('3333')
            stoIterator.next()
        },1000)
    }